package br.unicamp.ic.sgct.server.dominio.entidades;

import it.biobytes.ammentos.AutomaticType;
import it.biobytes.ammentos.FieldTypeEnum;
import it.biobytes.ammentos.PersistentEntity;
import it.biobytes.ammentos.PersistentField;
import it.biobytes.ammentos.PersistentList;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import br.unicamp.ic.sgct.client.dominio.to.InscricaoTO;
import br.unicamp.ic.sgct.client.dominio.to.SessaoTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;
//INICIO - EXERC 1
@SuppressWarnings("serial")
@PersistentEntity(sourceDomain = "T_USUARIO", primaryKey = "id_usuario",validator="br.unicamp.ic.sgct.server.dominio.entidades.validacao.UsuarioValidator")
//FIM - EXERC 1
public class Usuario implements Serializable {
	@PersistentField(fieldName="id_usuario", automatic=true, automaticType=AutomaticType.FRAMEWORK)
	private long id;

	@PersistentField(size="08")
	private String senha;

	@PersistentField(size="30")
	private String email;

	@PersistentField(fieldName="id_pessoa", type=FieldTypeEnum.ENTITY)
	private Pessoa pessoa;

	@PersistentList(
		sourceDomain = "T_USUARIO_SESSOES",
		cascadeOnDelete = false,
		cascadeOnSave = true,
		deleteOnRemove = false,
		query = "ID_USUARIO = ?"
		)
	private List<Inscricao> inscricaoList;

	public Usuario() {
		super();
	}

	/**
	 * 
	 * @param idUsuario
	 */
	public Usuario(long id) {
		super();
		this.id = id;
	}

	/**
	 * 
	 * @param senha
	 * @param email
	 * @param pessoa
	 */
	public Usuario(String senha, String email, Pessoa pessoa) {
		super();
		this.senha = senha;
		this.email = email;
		this.pessoa = pessoa;
	}

	public Usuario(UsuarioTO to) {
		this.senha = to.getSenha();
		this.email = to.getEmail();
		// System.out.println("Usuario.dataEfetivacaoPagto: " + this.dataEfetivacaoPagto);
		
		this.pessoa = new Pessoa();
		this.pessoa.setCelular( to.getPessoa().getCelular() );
		this.pessoa.setFoneResidencial( to.getPessoa().getFoneResidencial() );
		this.pessoa.setNome( to.getPessoa().getNome() );
		this.pessoa.setSobreNome( to.getPessoa().getSobreNome() );
		
		this.inscricaoList = new ArrayList<Inscricao>();
		if(to.getInscricaoList() != null) {
			for (InscricaoTO inscricaoTo : to.getInscricaoList()) {
				SessaoTO sessaoTo = inscricaoTo.getSessao();
				
				Inscricao inscricao = new Inscricao();
				
				inscricao.setDataEfetivacaoPagto(inscricaoTo.getDataEfetivacaoPagto());
				inscricao.setDataInscricao(inscricaoTo.getDataInscricao());
				inscricao.setId(inscricaoTo.getId());
				inscricao.setSituacao(inscricaoTo.getSituacao());
				
			    Sessao sessao = new Sessao();
			    sessao.setTema(sessaoTo.getTema());
			    sessao.setSequencialPeriodo(sessaoTo.getSequencialPeriodo());
			    sessao.setPeriodo(sessaoTo.getPeriodo());
			    sessao.setId(sessaoTo.getId());
			    sessao.setData(sessaoTo.getData());
			    
			    inscricao.setSessao(sessao);
			    inscricao.setUsuario(this);
			    
			    this.inscricaoList.add(inscricao);
		    
			}
		}
	}
	
	//~ getters & setters
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public List<Inscricao> getInscricaoList() {
	    return inscricaoList;
	}

	public void setInscricaoList(List<Inscricao> inscricaoList) {
	    this.inscricaoList = inscricaoList;
	}

	/**
	 * Constructs a <code>String</code> with all attributes
	 * in name = value format.
	 *
	 * @return a <code>String</code> representation 
	 * of this object.
	 */
	public String toString()
	{
	    final String TAB = "    ";
	    
	    String retValue = "";
	    
	    retValue = "Usuario ( "
	        + super.toString() + TAB
	        + "id = " + this.id + TAB
	        + "senha = " + this.senha + TAB
	        + "email = " + this.email + TAB
	        + "pessoa = " + (this.pessoa != null ? this.pessoa.toString() + TAB : "NULL ")
	        + " )";

	    return retValue;
	}
}